﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace FW
{
    public class txtHandler
    {
        public txtHandler()
        { }


        public string csv2quotecsv(string _linha, string _separador, string _quote)
        {
            string ret = "";
            bool achouAspas = false;
            _linha = _linha.Replace("\n", "").Replace("\r", "");
            string campo = "";
            List<string> campos = new List<string>();

            for (int i = 0; i < _linha.Length; i++)
            {
                if ((_linha.Substring(i, 1) == _separador) && !achouAspas)
                {
                    campos.Add(campo);
                    campo = "";
                }
                else
                {
                    if (_linha.Substring(i, 1) == _quote)
                    {
                        achouAspas = achouAspas ? false : true;
                    }
                    else
                    {
                        campo = campo + _linha.Substring(i, 1);
                    }
                }
                if ((i + 1) == _linha.Length)
                {
                    campos.Add(campo);
                }
            }

            foreach (string s in campos)
            {
                ret = ret + _quote + s + _quote+_separador;
            }


            return ret;
        }

        public List<string> linha2ListUnquoted(string _linha, string _separador, int _qtdEsperada, string _quote)
        {
            List<string> lret = new List<string>();
            string campo = "";
            bool a1 = false; // primeira aspas
            bool a2 = false; // segunda aspas
            bool c0 = false; // separador
            string caract = ""; // caracter da vez
            for (int x = 0; x < _linha.Length - 1; x++)
            {
                caract = _linha.Substring(x, 1);
                if (caract == _quote)
                {
                    if (a1 && !a2) // se cota aberta -> fecha
                    {
                        a1 = false;
                        a2 = true;
                    }
                    else if (!a1 && a2) // se cota fechada -> abre
                    {
                        a1 = true;
                        a2 = false;
                    }
                    else // primeira vez encontrador cota
                    {
                        a1 = true;
                        a2 = false;
                    }
                }

                if (caract == _separador) 
                {
                    if (a1 && !a2) // se cota abert ignora separador
                    {
                        c0 = false;
                    }
                    else // se cota fechada ou nenhum encontrada separador é separador
                    {
                        c0 = true;
                    }
                }

                //if (a1 && !a2 && _linha.Substring(x, 1) != _quote)
                //{
                //    campo = campo + _linha.Substring(x, 1);
                //}

                //if (!a1 && a2 && _linha.Substring(x, 1) == _quote)
                //{
                //    ls.Add(campo);
                //    campo = "";
                //}

                if (c0)
                {
                    
                    lret.Add(campo);
                    campo = "";
                    c0 = false;    
                }
                else
                {
                    if (caract != _quote && caract != _separador)
                    {
                        campo = campo + caract;
                    }

                }

            }


            //if (_linha.IndexOf("\"") > -1)
            //{
                
            //}
            //else
            //{
            //    lret = _linha.Split(Convert.ToChar(_separador)).ToList<string>();

            if (lret.Count != _qtdEsperada) // se qtd de campos é diferente do esperado completa lista com brancos.
            {
                if (lret.Count < _qtdEsperada)
                {
                    int qtdAdd = _qtdEsperada - lret.Count;

                    for (int i = 0; i < qtdAdd; i++)
                    {
                        lret.Add("");
                    }
                }
            }
            //}
            return lret;
        }

        public List<string> linha2ListQuoted(string _linha, string _quote)
        {
            List<string> ls = new List<string>();
            string campo = "";
            bool a1 = false; // primeira aspas
            bool a2 = false; // segunda aspas
            for (int x = 0; x < _linha.Length - 1; x++)
            {
                if (_linha.Substring(x, 1) == _quote)
                {
                    if (a1 && !a2)
                    {
                        a1 = false;
                        a2 = true;
                    }
                    else if (!a1 && a2)
                    {
                        a1 = true;
                        a2 = false;
                    }
                    else
                    {
                        a1 = true;
                        a2 = false;
                    }
                }

                if (a1 && !a2 && _linha.Substring(x, 1) != _quote)
                {
                    campo = campo + _linha.Substring(x, 1);
                }

                if (!a1 && a2 && _linha.Substring(x, 1) == _quote)
                {
                    ls.Add(campo.Trim().Replace(" ", ""));
                    campo = "";
                }

            }


            return ls;
        }
        public List<string> linha2ListQuotedFields(string _linha, string _quote)
        {
            List<string> ls = new List<string>();
            string campo = "";
            bool a1 = false; // primeira aspas
            bool a2 = false; // segunda aspas
            for (int x = 0; x < _linha.Length - 1; x++)
            {
                if (_linha.Substring(x, 1) == _quote)
                {
                    if (a1 && !a2)
                    {
                        a1 = false;
                        a2 = true;
                    }
                    else if (!a1 && a2)
                    {
                        a1 = true;
                        a2 = false;
                    }
                    else
                    {
                        a1 = true;
                        a2 = false;
                    }
                }

                if (a1 && !a2 && _linha.Substring(x, 1) != _quote)
                {
                    campo = campo + _linha.Substring(x, 1);
                }

                if (!a1 && a2 && _linha.Substring(x, 1) == _quote)
                {
                    ls.Add(campo.Trim());
                    campo = "";
                }

            }


            return ls;
        }

        public List<string> getHeader(string _linha1, string _quote, string _separador)
        {
            List<string> ret = new List<string>();

            if (_linha1.IndexOf(_quote) > -1)
            {
                ret = linha2ListQuoted(_linha1, _quote);
            }
            else
            {
                List<string> tret = _linha1.Split(Convert.ToChar(_separador)).ToList<string>();
                foreach (string s in tret)
                { 
                    ret.Add(s.Trim().Replace(" ",""));
                }
                tret = null;
            }

            return ret;
        }
        public List<string> getFields(string _linha1, string _quote, string _separador)
        {
            List<string> ret = new List<string>();

            if (_linha1.IndexOf(_quote) > -1)
            {
                ret = linha2ListQuotedFields(_linha1, _quote);
            }
            else
            {
                List<string> tret = _linha1.Split(Convert.ToChar(_separador)).ToList<string>();
                foreach (string s in tret)
                {
                    ret.Add(s.Trim());
                }
                tret = null;
            }

            return ret;
        }
        public string FirstLine(string _caminho)
        {
            string ret = "";

            Encoding enc = Encoding.GetEncoding("ISO-8859-1");
            FileInfo fi = new FileInfo(_caminho);
            if (fi.Exists)
            {
                StreamReader sr = new System.IO.StreamReader(_caminho, enc);
                while (!sr.EndOfStream)
                {
                    string line = FW.HtmlRemoval.StripTagsCharArray(sr.ReadLine());
                    ret = line;
                    break;
                }
                sr.Dispose();
                sr.Close();
                sr = null;
            }
            else
            {
                ret = "";
            }
            fi = null;

            return ret;
        }
    }
}
